import com.fasterxml.jackson.databind.ObjectMapper;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.sql.*;
import java.util.ArrayList;
import java.util.List;

//因为约定好发过来的数据是json格式的,所以定义一个类用来解析json的body
class Message {
    public String from;
    public String to;
    public String message;
}

@WebServlet("/message")
public class MessageServlet extends HttpServlet {

//    private List<Message> messagesList= new ArrayList<>();
    private ObjectMapper objectMapper = new ObjectMapper();


//    读取请求里的json格式的数据,并且在服务器中保存数据
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        Message message = objectMapper.readValue(req.getInputStream(),Message.class);
//        利用自定义的变量存放的数据
//        messagesList.add(message);
        save(message);
//        设置好状态码
        resp.setStatus(200);
    }

    //    从服务器获取数据
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//        从服务器中读取到保存的数据,然后返回给前端页面
//        将messagesList存放的Java对象的数据转换成json格式的数据
//        再将这个字符串写到响应的对象当中


        resp.setContentType("application/json; charset=utf-8");
//        objectMapper.writeValue(resp.getWriter(),messagesList);
//        上面的这一行代码其实完成了下面的这两步操作
//        String jsonResp = objectMapper.writeValueAsString(messagesList);
//        System.out.println("jsonResp: "+jsonResp);
        List<Message> messageList = load();
        String jsonResp = objectMapper.writeValueAsString(messageList);
        System.out.println("jsonResp: "+jsonResp);
        resp.getWriter().write(jsonResp);

    }

//    保存数据到数据库
    private void save(Message message) {
        Connection connection = null;
        PreparedStatement statement = null;
        try {
//        这里进行的是数据库插入操作
//        1.与数据库进行连接
            connection = DBUtil.getConnection();
//        2.构建sql语句
//        这里的?是占位符,因为要添加的是变量
            String sql = "insert into message values(?,?,?)";
//        3.预解析一下sql数据
            statement = connection.prepareStatement(sql);
//        4.将占位符进行替换
            statement.setString(1,message.from);
            statement.setString(2,message.to);
            statement.setString(3,message.message);
//        5.执行sql语句
            statement.executeUpdate();
//
        } catch (SQLException e) {
            e.printStackTrace();
        }finally {
//        6.释放资源
            DBUtil.close(connection,statement,null);
        }
    }

//    获取数据库的所有数据
    private List<Message> load() {
        List<Message> messageList = new ArrayList<>();
        Connection connection = null;
        PreparedStatement statement = null;
        ResultSet resultSet = null;
        try {
//      1.与数据库建立连接
            connection = DBUtil.getConnection();
//      2.构建sql语句
            String sql = "select * from message";
//      3.解析sql语句
            statement = connection.prepareStatement(sql);
//      4.执行sql语句,并且用结果集接收
            resultSet = statement.executeQuery();
//      5.遍历这个结果集,利用迭代器的方式
            while (resultSet.next()) {
//                将获取到的每个结果设置到message中
                Message message = new Message();
                message.from = resultSet.getString("from");
                message.to = resultSet.getString("to");
                message.message = resultSet.getString("message");
//                最后添加的messageList中
                messageList.add(message);
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }finally {
            DBUtil.close(connection,statement,resultSet);
        }
        return messageList;
    }

}
